#include <iostream>

#include "RightValueRef.h"

int main()
{
    {
        // 左值
        int nVar{10}; // nVar是左值
        std::string strVar{"Hello"}; //strVar是左值
        int& ref = nVar; // ref是左值引用
    }
    {
        // 右值
        int nVar = 20 + 30; // 20+30 是字面值也是右值
        int&& rref{100}; // rref是右值引用，100是右值
        auto strVar{std::string{"Temp"}}; // std::string{"Temp"} 是右值
        std::string&& str = std::string("Hello"); // 右值引用可以延长临时对象的声明周期
    }

    // auto& refVar{RightValueRef::getInstance()}; // 不允许绑定右值
    auto&& rrefVar{RightValueRef::getInstance()}; // 临时变量绑定右值
    auto var{RightValueRef::getInstance()};  // 返回为右值，调用移动构造函数
    const auto& crefVar{RightValueRef::getInstance()}; // 常量左值引用是一个万能引用类型，它可以接受左值、右值、常量左值和常量右值。

    return 0;
}
